home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 684 / 684.xpi / chrome / fireftp.jar / content / js / etc / sessionsPasswords.js < prev    next >
Encoding:
Text File  |  2008-07-04  |  34.5 KB  |  990 lines

  1. function createAccount() {
  2.   if (!gSiteManager.length) {
  3.     newSite();
  4.   }
  5. }
  6.  
  7. function newSite() {
  8.   var newSiteCallback = function(site) {
  9.     gSiteManager.push(site);
  10.     accountHelper(site);
  11.   };
  12.  
  13.   var params = { callback    : newSiteCallback,
  14.                  siteManager : gSiteManager,
  15.                  localPath   : gLocalPath,
  16.                  remotePath  : gRemotePath,
  17.                  site        : { account  : "", host     : "",   port             : 21,    login          : "",    password : "",     anonymous : false,
  18.                                  security : "", pasvmode : true, ipmode           : false, treesync       : false, localdir : "",     remotedir : "",
  19.                                  webhost  : "", prefix   : "",   downloadcasemode : 0,     uploadcasemode : 0,     encoding : "UTF-8",
  20.                                  notes    : "", timezone : 0,    folder           : "",    privatekey     : "" } };
  21.  
  22.   window.openDialog("chrome://fireftp/content/accountManager.xul", "accountManager", "chrome,dialog,resizable,centerscreen", params);
  23. }
  24.  
  25. function editSite() {
  26.   if (!gAccountField.value) {
  27.     return;
  28.   }
  29.  
  30.   var editSite;                                                      // grab a copy of the old site
  31.  
  32.   for (var x = 0; x < gSiteManager.length; ++x) {
  33.     if (gSiteManager[x].account == gAccountField.value) {
  34.       editSite = new cloneObject(gSiteManager[x]);
  35.       break;
  36.     }
  37.   }
  38.  
  39.   var oldSite = new cloneObject(editSite);
  40.  
  41.   var editSiteCallback = function(site) {
  42.     if (site.markedForDeath) {
  43.       deleteSite(site);
  44.       return;
  45.     }
  46.  
  47.     for (var x = 0; x < gSiteManager.length; ++x) {
  48.       if (gSiteManager[x].account == oldSite.account) {
  49.         gSiteManager[x] = site;
  50.         break;
  51.       }
  52.     }
  53.  
  54.     try {                                                            // delete old password from list
  55.       var recordedHost = (oldSite.host.indexOf("ftp.") == 0 ? '' : "ftp.") + oldSite.host;
  56.       var logins       = gLoginManager.findLogins({}, recordedHost, "FireFTP", null);
  57.       for (var x = 0; x < logins.length; ++x) {
  58.         if (logins[x].username == oldSite.login) {
  59.           gLoginManager.removeLogin(logins[x]);
  60.         }
  61.       }
  62.     } catch (ex) { }
  63.  
  64.     accountHelper(site);
  65.   };
  66.  
  67.   var params          = { callback    : editSiteCallback,
  68.                           siteManager : gSiteManager,
  69.                           localPath   : gLocalPath,
  70.                           remotePath  : gRemotePath,
  71.                           site        : editSite };
  72.  
  73.   window.openDialog("chrome://fireftp/content/accountManager.xul", "accountManager", "chrome,dialog,resizable,centerscreen", params);
  74. }
  75.  
  76. function deleteSite(site) {
  77.   for (var x = 0; x < gSiteManager.length; ++x) {                    // delete the account
  78.     if (gSiteManager[x].account == site.account) {
  79.       try {                                                          // delete password from list
  80.         var recordedHost = (gSiteManager[x].host.indexOf("ftp.") == 0 ? '' : "ftp.") + gSiteManager[x].host;
  81.         var logins       = gLoginManager.findLogins({}, recordedHost, "FireFTP", null);
  82.         for (var y = 0; y < logins.length; ++y) {
  83.           if (logins[y].username == gSiteManager[x].login) {
  84.             gLoginManager.removeLogin(logins[y]);
  85.           }
  86.         }
  87.       } catch (ex) { }
  88.  
  89.       gSiteManager.splice(x, 1);
  90.  
  91.       break;
  92.     }
  93.   }
  94.  
  95.   saveSiteManager();
  96.   loadSiteManager();
  97.  
  98.   onFolderChange();
  99. }
  100.  
  101. function quickConnect() {                                            // make a quick connection, account not saved
  102.   var quickConnectCallback = function(site) {
  103.     tempAccountHelper(site);
  104.   };
  105.  
  106.   var quickConnectCancelCallback = function() {
  107.     $('quickMenuItem').setAttribute("disabled", gFtp.isConnected);
  108.   };
  109.  
  110.   $('quickMenuItem').setAttribute("disabled", true);
  111.  
  112.   var params = { callback       : quickConnectCallback,
  113.                  cancelCallback : quickConnectCancelCallback,
  114.                  siteManager    : gSiteManager,
  115.                  quickConnect   : true,
  116.                  localPath      : gLocalPath,
  117.                  remotePath     : gRemotePath,
  118.                  site           : { account  : "", host     : "",   port             : 21,    login          : "",    password : "",     anonymous : false,
  119.                                     security : "", pasvmode : true, ipmode           : false, treesync       : false, localdir : "",     remotedir : "",
  120.                                     webhost  : "", prefix   : "",   downloadcasemode : 0,     uploadcasemode : 0,     encoding : "UTF-8",
  121.                                     notes    : "", timezone : 0,    folder           : "",    privatekey     : "",
  122.                                     temporary : true } };
  123.  
  124.   window.openDialog("chrome://fireftp/content/accountManager.xul", "accountManager", "chrome,dialog,resizable,centerscreen", params);
  125. }
  126.  
  127. function externalLink() {                                            // opened up fireFTP using a link in Firefox
  128.   var site = { account  : "", host     : "",            port             : 21,    login          : "anonymous", password : "fireftp@example.com", anonymous : true,
  129.                security : "", pasvmode : gTempPasvMode, ipmode           : false, treesync       : false,       localdir : "",                    remotedir : "",
  130.                webhost  : "", prefix   : "",            downloadcasemode : 0,     uploadcasemode : 0,           encoding : "UTF-8",
  131.                notes    : "", timezone : 0,             folder           : "",    privatekey     : "",
  132.                temporary : true };
  133.  
  134.   var uri    = Components.classes["@mozilla.org/network/standard-url;1"].getService(Components.interfaces.nsIURI);
  135.   var toUTF8 = Components.classes["@mozilla.org/intl/utf8converterservice;1"].getService(Components.interfaces.nsIUTF8ConverterService);
  136.   uri.spec   = gLoadUrl;
  137.  
  138.   if (!uri.schemeIs("ftp") || gLoadUrl.length <= 6) {                // sanity check
  139.     return;
  140.   }
  141.  
  142.   if (uri.username) {
  143.     site.login     = unescape(uri.username);
  144.     site.password  = unescape(uri.password);
  145.     site.anonymous = site.login ? false : true;
  146.   }
  147.  
  148.   if (uri.username && !uri.password) {
  149.     try {
  150.       var logins = gLoginManager.findLogins({}, 'ftp://' + site.login + '@' + uri.host, "FireFTP", null);
  151.       for (var x = 0; x < logins.length; ++x) {
  152.         if (logins[x].username == site.login) {
  153.           site.password = logins[x].password;
  154.           break;
  155.         }
  156.       }
  157.     } catch (ex) { }
  158.   }
  159.  
  160.   if (!uri.username && !uri.password) {
  161.     try {
  162.       var logins = gLoginManager.findLogins({}, 'ftp://' + uri.host, "FireFTP", null);
  163.       for (var x = 0; x < logins.length; ++x) {
  164.         site.login    = logins[x].username;
  165.         site.password = logins[x].password;
  166.         break;
  167.       }
  168.     } catch (ex) { }
  169.   }
  170.  
  171.   site.host = uri.host;
  172.   site.port = uri.port == -1 ? 21 : uri.port;
  173.  
  174.   var prefBranch   = gPrefsService.getBranch("browser.");
  175.   gLoadUrl         = uri.path.charAt(uri.path.length - 1) == '/' ? "" : unescape(uri.path);
  176.  
  177.   try {
  178.     gLoadUrl       = toUTF8.convertStringToUTF8(gLoadUrl, "UTF-8", 1);
  179.   } catch (ex) {
  180.     debug(ex);
  181.   }
  182.  
  183.   try {
  184.     if (prefBranch.getBoolPref("download.useDownloadDir")) {
  185.       site.localdir  = prefBranch.getComplexValue("download.dir", Components.interfaces.nsISupportsString).data;
  186.     }
  187.   } catch (ex) { }
  188.  
  189.   site.remotedir = gLoadUrl == "" ? unescape(uri.path) : unescape(uri.path.substring(0, uri.path.lastIndexOf('/')));
  190.  
  191.   try {
  192.     site.remotedir = toUTF8.convertStringToUTF8(site.remotedir, "UTF-8", 1);
  193.   } catch (ex) {
  194.     debug(ex);
  195.   }
  196.  
  197.   gPrefs.setCharPref("loadurl", "");
  198.  
  199.   tempAccountHelper(site);
  200. }
  201.  
  202. function accountHelper(site) {
  203.   if (gPasswordMode && site.password) {
  204.     try {                                                            // save username & password
  205.       var recordedHost = (site.host.indexOf("ftp.") == 0 ? '' : "ftp.") + site.host;
  206.       var loginInfo    = new gLoginInfo(recordedHost, "FireFTP", null, site.login, site.password, "", "");
  207.       gLoginManager.addLogin(loginInfo);
  208.     } catch (ex) { }
  209.   }
  210.  
  211.   var tempPassword = site.password;
  212.   saveSiteManager();                                                 // save site manager
  213.   loadSiteManager();
  214.  
  215.   for (var x = 0; x < gSiteManager.length; ++x) {                    // select the new site
  216.     if (gSiteManager[x].account == site.account) {
  217.       gAccountField.selectedIndex = x;
  218.       gSiteManager[x].password    = tempPassword;                    // if "Remember Passwords" is off we have to remember what it is temporarily
  219.       onAccountChange(site.account);
  220.       break;
  221.     }
  222.   }
  223. }
  224.  
  225. function tempAccountHelper(site) {
  226.   site.account = site.host;
  227.  
  228.   var found = true;
  229.   var count = 0;
  230.  
  231.   while (found) {
  232.     found = false;
  233.  
  234.     for (var x = 0; x < gSiteManager.length; ++x) {
  235.       if (gSiteManager[x].account == site.account) {
  236.         found = true;
  237.         ++count;
  238.         site.account = site.host + '-' + count.toString();
  239.         break;
  240.       }
  241.     }
  242.   }
  243.  
  244.   gSiteManager.push(site);
  245.  
  246.   accountHelper(site);
  247.  
  248.   connect(true);
  249. }
  250.  
  251. function onFolderChange(dontSelect, click) {
  252.   if (click && gFolder == gFolderField.value) {
  253.     return;
  254.   }
  255.  
  256.   gAccountField.removeAllItems();
  257.  
  258.   if (!gSiteManager.length) {
  259.     gAccountField.setAttribute("label", gStrbundle.getString("createAccount"));
  260.   }
  261.  
  262.   gAccountField.appendItem(gStrbundle.getString("createAccount"), "");
  263.   gAccountField.firstChild.lastChild.setAttribute("oncommand", "newSite()");
  264.   gAccountField.appendItem(gStrbundle.getString("quickConnectMenu"), "");
  265.   gAccountField.firstChild.lastChild.setAttribute("id", "quickMenuItem");
  266.   gAccountField.firstChild.lastChild.setAttribute("oncommand", "quickConnect()");
  267.  
  268.   if (gSiteManager.length) {
  269.     gAccountField.firstChild.appendChild(document.createElement("menuseparator"));
  270.   }
  271.  
  272.   for (var x = 0; x < gSiteManager.length; ++x) {
  273.     if (gSiteManager[x].folder == gFolderField.value || (!gSiteManager[x].folder && gFolderField.value == "")) {
  274.       gAccountField.appendItem(gSiteManager[x].account, gSiteManager[x].account);
  275.     }
  276.   }
  277.  
  278.   if (!dontSelect && gSiteManager.length) {
  279.     gAccountField.selectedIndex = 3;
  280.     onAccountChange();
  281.   }
  282.  
  283.   gFolder = gFolderField.value;
  284. }
  285.  
  286. function onAccountChange(account) {
  287.   if (account != null) {
  288.     var found = -1;
  289.  
  290.     for (var x = 0; x < gSiteManager.length; ++x) {
  291.       if (gSiteManager[x].account == account) {
  292.         found = x;
  293.         break;
  294.       }
  295.     }
  296.  
  297.     if (found == -1) {
  298.       gFolderField.value = "";
  299.       onFolderChange();
  300.       return;
  301.     }
  302.  
  303.     gFolderField.value  = gSiteManager[x].folder;
  304.     onFolderChange(true);
  305.     gAccountField.value = account;
  306.   }
  307.  
  308.   var accountToLoad = gFtp.isConnected ? gAccount : gAccountField.value;
  309.  
  310.   for (var x = 0; x < gSiteManager.length; ++x) {                    // load up the new values into the global variables
  311.     if (gSiteManager[x].account == accountToLoad) {
  312.       accountChangeHelper(gSiteManager[x]);
  313.       break;
  314.     }
  315.   }
  316.  
  317.   if (gAccountField.value) {
  318.     accountButtonsDisabler(false);
  319.   }
  320. }
  321.  
  322. var gDidPuttyCredit = false;
  323. function accountChangeHelper(site) {
  324.   if (!gFtp.isConnected) {
  325.     gFtp.setSecurity(site.security);
  326.  
  327.     if (site.security == "sftp" && !gDidPuttyCredit) {
  328.       appendLog(gStrbundle.getFormattedString("putty", ["0.60"])
  329.         + "<br style='font-size:5pt'/><br style='font-size:5pt'/>", 'blue', "info");
  330.       gDidPuttyCredit = true;
  331.     }
  332.   }
  333.  
  334.   for (var x = 0; x < gMaxCon; ++x) {
  335.     if (!gFtp.isConnected) {
  336.       gConnections[x].host       = site.host;
  337.       gConnections[x].port       = site.port;
  338.       gConnections[x].login      = site.login;
  339.       gConnections[x].password   = site.password;
  340.       gConnections[x].privatekey = site.privatekey;
  341.     }
  342.  
  343.     gConnections[x].passiveMode  = site.pasvmode;
  344.     gConnections[x].ipType       = site.ipmode ? "IPv6" : "IPv4";
  345.     gConnections[x].setEncoding   (site.encoding || "UTF-8");
  346.     gConnections[x].initialPath  = site.remotedir ? site.remotedir : '';
  347.     gConnections[x].timezone     = site.timezone  ? site.timezone  : 0;
  348.   }
  349.  
  350.   gAccount          = site.account;
  351.   gDownloadCaseMode = site.downloadcasemode;
  352.   gUploadCaseMode   = site.uploadcasemode;
  353.   gWebHost          = site.webhost;
  354.   gPrefix           = site.prefix;
  355.   gTreeSync         = site.treesync;
  356.   gTreeSyncLocal    = site.localdir;
  357.   gTreeSyncRemote   = site.remotedir;
  358.  
  359.   if (!gFtp.isConnected) {
  360.     if (site.localdir) {
  361.       var dir = localFile.init(site.localdir);
  362.       if (localFile.verifyExists(dir)) {
  363.         localDirTree.changeDir(site.localdir);
  364.       } else {
  365.         error(gStrbundle.getString("noPermission"));
  366.       }
  367.     }
  368.  
  369.     if (site.remotedir) {
  370.       gRemotePath.value = site.remotedir;
  371.     } else {
  372.       gRemotePath.value = "/";
  373.     }
  374.   }
  375.  
  376.   if (site.account) {
  377.     var sString  = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
  378.     sString.data = site.account;
  379.     gPrefs.setComplexValue("defaultaccount", Components.interfaces.nsISupportsString, sString);
  380.   }
  381.  
  382.   accountButtonsDisabler(false);
  383. }
  384.  
  385. function setConnectButton(connect) {
  386.   gConnectButton.label =                   connect ? gStrbundle.getString("connectButton") : gStrbundle.getString("disconnectButton");
  387.   gConnectButton.setAttribute('command',   connect ? 'cmd_connect'                         : 'cmd_disconnect');
  388.   gConnectButton.setAttribute('accesskey', connect ? gStrbundle.getString("connectAccess") : gStrbundle.getString("disconnectAccess"));
  389. }
  390.  
  391. function accountButtonsDisabler(enable) {
  392.   $('editMenuItem').setAttribute(  "disabled", enable);
  393.  
  394.   if (!gFtp.isConnected) {
  395.     $('connectbutton').disabled = enable;
  396.   }
  397. }
  398.  
  399. function connectedButtonsDisabler() {
  400.   $('abortbutton').disabled =                             !gFtp.isConnected;
  401.   $('retrieveButton').disabled =                          !gFtp.isConnected;
  402.   $('storeButton').disabled =                             !gFtp.isConnected;
  403.   $('remoteUpButton').disabled =                          !gFtp.isConnected;
  404.   $('remoteRefreshButton').disabled =                     !gFtp.isConnected;
  405.   $('remoteChangeButton').disabled =                      !gFtp.isConnected;
  406.   $('searchRemote').disabled =                            !gFtp.isConnected;
  407.   $('diffMenuItem').setAttribute(             "disabled", !gFtp.isConnected);
  408.   $('recDiffMenuItem').setAttribute(          "disabled", !gFtp.isConnected);
  409.   $('customMenuItem').setAttribute(           "disabled", !gFtp.isConnected);
  410.   $('localUpload').setAttribute(              "disabled", !gFtp.isConnected);
  411.   $('remoteOpenCont').setAttribute(           "disabled", !gFtp.isConnected);
  412.   $('remoteDownload').setAttribute(           "disabled", !gFtp.isConnected);
  413.   $('remoteOpen').setAttribute(               "disabled", !gFtp.isConnected);
  414.   $('remoteOpenWith').setAttribute(           "disabled", !gFtp.isConnected);
  415.   $('remoteWeb').setAttribute(                "disabled", !gFtp.isConnected);
  416.   $('remoteCopyUrl').setAttribute(            "disabled", !gFtp.isConnected);
  417.   $('remoteFXP').setAttribute(                "disabled", !gFtp.isConnected || gFtp.security == "sftp");
  418.   $('remoteCutContext').setAttribute(         "disabled", !gFtp.isConnected);
  419.   $('remotePasteContext').setAttribute(       "disabled", !gFtp.isConnected);
  420.   $('remoteCreateDir').setAttribute(          "disabled", !gFtp.isConnected);
  421.   $('remoteCreateFile').setAttribute(         "disabled", !gFtp.isConnected);
  422.   $('remoteRemove').setAttribute(             "disabled", !gFtp.isConnected);
  423.   $('remoteRename').setAttribute(             "disabled", !gFtp.isConnected);
  424.   $('remoteProperties').setAttribute(         "disabled", !gFtp.isConnected);
  425.   $('remoteRecursiveProperties').setAttribute("disabled", !gFtp.isConnected);
  426.   $('queueRetry').setAttribute(               "disabled", !gFtp.isConnected);
  427.   $('queueCancel').setAttribute(              "disabled", !gFtp.isConnected);
  428.   $('queueCancelAll').setAttribute(           "disabled", !gFtp.isConnected);
  429.   if ($('quickMenuItem')) {
  430.     $('quickMenuItem').setAttribute(          "disabled",  gFtp.isConnected);
  431.   }
  432.   $('remotepath').setAttribute("disconnected",            !gFtp.isConnected);
  433.   remoteDirTree.treebox.invalidate();
  434.   remoteTree.treebox.invalidate();
  435.  
  436.   searchSelectType();
  437. }
  438.  
  439. function loadSiteManager(pruneTemp, importFile) {             // read gSiteManager data
  440.   try {
  441.     gFolderField.removeAllItems();
  442.  
  443.     if (!gFtp.isConnected) {
  444.       gFtp.setSecurity("");
  445.  
  446.       for (var x = 0; x < gMaxCon; ++x) {
  447.         gConnections[x].host         = "";
  448.         gConnections[x].port         = 21;
  449.         gConnections[x].login        = "";
  450.         gConnections[x].password     = "";
  451.         gConnections[x].passiveMode  = true;
  452.         gConnections[x].initialPath  = "";
  453.         gConnections[x].setEncoding("UTF-8");
  454.         gConnections[x].timezone     = 0;
  455.         gConnections[x].privatekey   = "";
  456.       }
  457.  
  458.       gAccount          = "";
  459.       gDownloadCaseMode = 0;
  460.       gUploadCaseMode   = 0;
  461.       gWebHost          = "";
  462.       gPrefix           = "";
  463.       gRemotePath.value = "/";
  464.     }
  465.  
  466.     var file;
  467.     if (importFile) {
  468.       file = importFile;
  469.     } else {
  470.       file = gProfileDir.clone();
  471.       file.append("fireFTPsites.dat");
  472.     }
  473.  
  474.     var folders = new Array();
  475.     if (!file.exists() && !importFile) {
  476.       gSiteManager = new Array();
  477.     } else if (file.exists()) {
  478.       var fstream  = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
  479.       var sstream  = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
  480.       fstream.init(file, 1, 0, false);
  481.       sstream.init(fstream);
  482.  
  483.       var siteData = "";
  484.       var str      = sstream.read(-1);
  485.  
  486.       while (str.length > 0) {
  487.         siteData += str;
  488.         str       = sstream.read(-1);
  489.       }
  490.  
  491.       if (localTree.getExtension(file.leafName) == "xml") {
  492.         siteData = importFileZilla(siteData);
  493.         siteData = siteData.toSource();
  494.       }
  495.  
  496.       if (importFile) {
  497.         try {
  498.           var tempSiteManager = eval(siteData);
  499.         } catch (ex) {
  500.           error(gStrbundle.getString("badImport"));
  501.           sstream.close();
  502.           fstream.close();
  503.           return;
  504.         }
  505.  
  506.         var passCheck = false;
  507.         var toUTF8    = Components.classes["@mozilla.org/intl/utf8converterservice;1"].getService(Components.interfaces.nsIUTF8ConverterService);
  508.         var key;
  509.         for (var x = 0; x < tempSiteManager.length; ++x) {
  510.           if (tempSiteManager[x].passcheck) {
  511.             passCheck = true;
  512.             var passwordObject       = new Object();
  513.             passwordObject.returnVal = false;
  514.  
  515.             window.openDialog("chrome://fireftp/content/password2.xul", "password", "chrome,modal,dialog,resizable,centerscreen", passwordObject);
  516.  
  517.             if (passwordObject.returnVal) {
  518.               key = passwordObject.password;
  519.             } else {
  520.               sstream.close();
  521.               fstream.close();
  522.               return;
  523.             }
  524.  
  525.             key = key ? key : "";
  526.             if (rc4Decrypt(key, tempSiteManager[x].password) != "check123") {
  527.               error(gStrbundle.getString("badPassword"));
  528.               sstream.close();
  529.               fstream.close();
  530.               return;
  531.             }
  532.             break;
  533.           }
  534.         }
  535.  
  536.         for (var x = 0; x < tempSiteManager.length; ++x) {
  537.           if (tempSiteManager[x].passcheck) {
  538.             continue;
  539.           }
  540.  
  541.           var found   = true;
  542.           var count   = 0;
  543.           var skip    = true;
  544.           var account = tempSiteManager[x].account;
  545.  
  546.           while (found) {
  547.             found = false;
  548.  
  549.             for (var y = 0; y < gSiteManager.length; ++y) {
  550.               if (gSiteManager[y].account == account) {
  551.                 found = true;
  552.  
  553.                 for (i in gSiteManager[y]) {                         // if it's the exact same object skip it
  554.                   if (i != "password" && gSiteManager[y][i] != tempSiteManager[x][i]) {
  555.                     skip = false;
  556.                     break;
  557.                   }
  558.                 }
  559.  
  560.                 if (skip) {
  561.                   break;
  562.                 }
  563.  
  564.                 ++count;
  565.                 account = tempSiteManager[x].account + '-' + count.toString();
  566.                 break;
  567.               }
  568.             }
  569.  
  570.             if (skip) {
  571.               break;
  572.             }
  573.           }
  574.  
  575.           if (skip && found) {
  576.             continue;
  577.           }
  578.  
  579.           if ((gSlash == "/" && tempSiteManager[x].localdir.indexOf("/") == -1) || (gSlash == "\\" && tempSiteManager[x].localdir.indexOf("\\") == -1)) {
  580.             tempSiteManager[x].localdir = "";
  581.             tempSiteManager[x].treesync = false;
  582.           }
  583.  
  584.           if (passCheck) {
  585.             tempSiteManager[x].password = rc4Decrypt(key, tempSiteManager[x].password);
  586.  
  587.             try {
  588.               tempSiteManager[x].password = toUTF8.convertStringToUTF8(tempSiteManager[x].password, "UTF-8", 1);
  589.             } catch (ex) {
  590.               debug(ex);
  591.             }
  592.           }
  593.  
  594.           if (gPasswordMode && tempSiteManager[x].password) {
  595.             try {                                                    // save username & password
  596.               var recordedHost = (tempSiteManager[x].host.indexOf("ftp.") == 0 ? '' : "ftp.") + tempSiteManager[x].host;
  597.               var loginInfo    = new gLoginInfo(recordedHost, "FireFTP", null, tempSiteManager[x].login, tempSiteManager[x].password, "", "");
  598.               gLoginManager.addLogin(loginInfo);
  599.             } catch (ex) { }
  600.           }
  601.  
  602.           tempSiteManager[x].account = account;
  603.           gSiteManager.push(tempSiteManager[x]);
  604.         }
  605.       } else {
  606.         gSiteManager = eval(siteData);
  607.       }
  608.  
  609.       if (gPasswordMode) {
  610.         for (var x = 0; x < gSiteManager.length; ++x) {              // retrieve passwords from passwordmanager
  611.           try {
  612.             var logins = gLoginManager.findLogins({}, (gSiteManager[x].host.indexOf("ftp.") == 0 ? '' : "ftp.") + gSiteManager[x].host, "FireFTP", null);
  613.             var found  = false;
  614.             for (var y = 0; y < logins.length; ++y) {
  615.               if (logins[y].username == gSiteManager[x].login) {
  616.                 gSiteManager[x].password = logins[y].password;
  617.                 found = true;
  618.                 break;
  619.               }
  620.             }
  621.             if (!found) {                                            // firefox 2 -> 3 growing pains, yay...
  622.               var logins = gLoginManager.findLogins({}, 'http://' + (gSiteManager[x].host.indexOf("ftp.") == 0 ? '' : "ftp.") + gSiteManager[x].host, "FireFTP", null);
  623.               for (var y = 0; y < logins.length; ++y) {
  624.                 if (logins[y].username == gSiteManager[x].login) {
  625.                   gSiteManager[x].password = logins[y].password;
  626.                   found = true;
  627.                   break;
  628.                 }
  629.               }
  630.             }
  631.             if (!found) {                                            // firefox 2 -> 3 growing pains, yay...
  632.               var logins = gLoginManager.findLogins({}, (gSiteManager[x].host.indexOf("ftp.") == 0 ? '' : "ftp.") + gSiteManager[x].host, null,
  633.                                                         (gSiteManager[x].host.indexOf("ftp.") == 0 ? '' : "ftp.") + gSiteManager[x].host);
  634.               for (var y = 0; y < logins.length; ++y) {
  635.                 if (logins[y].username == gSiteManager[x].login) {
  636.                   gSiteManager[x].password = logins[y].password;
  637.                   break;
  638.                 }
  639.               }
  640.             }
  641.           } catch (ex) { }
  642.         }
  643.       }
  644.  
  645.       sstream.close();
  646.       fstream.close();
  647.  
  648.       if (pruneTemp) {
  649.         for (var x = gSiteManager.length - 1; x >= 0; --x) {
  650.           if (gSiteManager[x].temporary) {
  651.             try {                                                    // delete password from list
  652.               var recordedHost = (gSiteManager[x].host.indexOf("ftp.") == 0 ? '' : "ftp.") + gSiteManager[x].host;
  653.               var logins       = gLoginManager.findLogins({}, recordedHost, "FireFTP", null);
  654.               for (var y = 0; y < logins.length; ++y) {
  655.                 if (logins[y].username == gSiteManager[x].login) {
  656.                   gLoginManager.removeLogin(logins[y]);
  657.                 }
  658.               }
  659.             } catch (ex) { }
  660.  
  661.             gSiteManager.splice(x, 1);
  662.           }
  663.         }
  664.       }
  665.  
  666.       for (var x = 0; x < gSiteManager.length; ++x) {
  667.         var found = false;
  668.         gSiteManager[x].folder = gSiteManager[x].folder || "";
  669.  
  670.         for (var y = 0; y < folders.length; ++y) {
  671.           if (gSiteManager[x].folder == folders[y]) {
  672.             found = true;
  673.             break;
  674.           }
  675.         }
  676.  
  677.         if (!found) {
  678.           folders.push(gSiteManager[x].folder);
  679.         }
  680.       }
  681.  
  682.       folders.sort();
  683.  
  684.       for (var x = 0; x < folders.length; ++x) {
  685.         gFolderField.appendItem(folders[x] ? folders[x] : gStrbundle.getString("noFolder"), folders[x]);
  686.       }
  687.     }
  688.  
  689.     if (!folders.length) {
  690.       gFolderField.appendItem(gStrbundle.getString("noFolder"), "");
  691.     }
  692.  
  693.     gFolderField.selectedIndex = 0;
  694.     $('folderItem').collapsed = !folders.length || (folders.length == 1 && folders[0] == "");
  695.  
  696.     if (gSiteManager.length) {
  697.       gAccountField.setAttribute("label", gStrbundle.getString("chooseAccount"));
  698.     } else {
  699.       gAccountField.setAttribute("label", gStrbundle.getString("createAccount"));
  700.     }
  701.  
  702.     accountButtonsDisabler(true);
  703.   } catch (ex) {
  704.     debug(ex);
  705.   }
  706. }
  707.  
  708. function saveSiteManager(exportFile) {
  709.   try {                                                              // write gSiteManager out to disk
  710.     var tempSiteManagerArray = new Array();
  711.  
  712.     for (var x = 0; x < gSiteManager.length; ++x) {
  713.       tempSiteManagerArray.push(new cloneObject(gSiteManager[x]));
  714.     }
  715.  
  716.     var key;
  717.     if (exportFile) {
  718.       var passwordObject       = new Object();
  719.       passwordObject.returnVal = false;
  720.  
  721.       window.openDialog("chrome://fireftp/content/password2.xul", "password", "chrome,modal,dialog,resizable,centerscreen", passwordObject);
  722.  
  723.       if (passwordObject.returnVal) {
  724.         key = passwordObject.password;
  725.       } else {
  726.         return;
  727.       }
  728.  
  729.       key = key ? key : "";
  730.       tempSiteManagerArray.push({ account: "a", passcheck: "check123", password: "check123" });
  731.     }
  732.  
  733.     var fromUTF8     = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].getService(Components.interfaces.nsIScriptableUnicodeConverter);
  734.     fromUTF8.charset = "UTF-8";
  735.     for (var x = 0; x < tempSiteManagerArray.length; ++x) {          // we don't save out the passwords, those are saved in the passwordmanager
  736.       if (exportFile) {
  737.         try {
  738.           tempSiteManagerArray[x].password = fromUTF8.ConvertFromUnicode(tempSiteManagerArray[x].password) + fromUTF8.Finish();
  739.         } catch (ex) {
  740.           debug(ex);
  741.         }
  742.  
  743.         tempSiteManagerArray[x].password = rc4Encrypt(key, tempSiteManagerArray[x].password);
  744.       } else {
  745.         tempSiteManagerArray[x].password = "";
  746.       }
  747.     }
  748.  
  749.     var file;
  750.     if (exportFile) {
  751.       file = exportFile;
  752.     } else {
  753.       file = gProfileDir.clone();
  754.       file.append("fireFTPsites.dat");
  755.     }
  756.  
  757.     var foutstream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
  758.     foutstream.init(file, 0x04 | 0x08 | 0x20, 0644, 0);
  759.     tempSiteManagerArray.sort(compareAccount);
  760.     foutstream.write(tempSiteManagerArray.toSource(), tempSiteManagerArray.toSource().length);
  761.     foutstream.close();
  762.   } catch (ex) {
  763.     debug(ex);
  764.   }
  765. }
  766.  
  767. function importSites() {
  768.   var nsIFilePicker   = Components.interfaces.nsIFilePicker;
  769.   var fp              = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  770.   fp.defaultExtension = "dat";
  771.   fp.appendFilter("FireFTP (*.dat)", "*.dat");
  772.   fp.appendFilter("FileZilla (*.xml)", "*.xml");
  773.   fp.init(window, null, nsIFilePicker.modeOpen);
  774.   var res = fp.show();
  775.  
  776.   if (res != nsIFilePicker.returnOK) {
  777.     return;
  778.   }
  779.  
  780.   var tempAccount = gAccountField.value;
  781.  
  782.   loadSiteManager(true, fp.file);
  783.   saveSiteManager();                                                 // save site manager
  784.   loadSiteManager();
  785.  
  786.   onAccountChange(tempAccount);                                      // select the new site
  787. }
  788.  
  789. function importFileZilla(theString) {
  790.   var parser    = new DOMParser();
  791.   var dom       = parser.parseFromString(theString, "text/xml");
  792.  
  793.   if (dom.documentElement.nodeName == "parsererror") {
  794.     error(gStrbundle.getString("badImport"));
  795.     return new Array();
  796.   }
  797.  
  798.   var el        = dom.firstChild.firstChild;
  799.   while (el) {                                                       // find the servers or sites element
  800.     if (el.nodeName == 'Sites' || el.nodeName == 'Servers') {
  801.       el = el.firstChild;
  802.       break;
  803.     }
  804.  
  805.     el = el.nextSibling;
  806.   }
  807.  
  808.   return fileZillaHelper(el);
  809. }
  810.  
  811. function fileZillaHelper(el, folder) {
  812.   var siteData = new Array();
  813.  
  814.   while (el) {                                                       // find the server or site element
  815.     if (el.nodeName == 'Folder') {
  816.       var newFolder  = (folder ? folder + "-" : "") + (el.getAttribute('Name') ? el.getAttribute('Name') : trim(el.firstChild.nodeValue));
  817.       var returnData = fileZillaHelper(el.firstChild, newFolder);
  818.  
  819.       for (var x = 0; x < returnData.length; ++x) {
  820.         siteData.push(returnData[x]);
  821.       }
  822.     } else if (el.nodeName == 'Site') {                              // filezilla 2
  823.       var password = "";
  824.  
  825.       if (el.getAttribute('Pass')) {
  826.         var cipher  = "FILEZILLA1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  827.         var pass    = el.getAttribute('Pass');
  828.         var passLen = parseInt(pass.length / 3);
  829.         var offset  = (pass.length / 3) % cipher.length;
  830.  
  831.         for (var x = 0; x < pass.length; x += 3) {
  832.           var c1 = parseInt(pass.substring(x, x + 3), 10);
  833.           var c2 = cipher.charCodeAt((x / 3 + offset) % cipher.length);
  834.           var c3 = String.fromCharCode(c1 ^ c2);
  835.           password += c3;
  836.         }
  837.       }
  838.  
  839.       var obj = {
  840.         account           : el.getAttribute('Name'),
  841.         folder            : folder ? folder : "",
  842.         host              : el.getAttribute('Host'),
  843.         port              : el.getAttribute('Port'),
  844.         login             : el.getAttribute('Logontype') == "0" ? "anonymous"           : el.getAttribute('User'),
  845.         password          : el.getAttribute('Logontype') == "0" ? "fireftp@example.com" : password,
  846.         anonymous         : el.getAttribute('Logontype') == "0",
  847.         security          : el.getAttribute('ServerType') == "1" ? "ssl" : (el.getAttribute('ServerType') == "2" ? "authssl" : (el.getAttribute('ServerType') == "3" ? "sftp" : (el.getAttribute('ServerType') == "4" ? "authtls" : ""))),
  848.         pasvmode          : el.getAttribute('PasvMode') != "2",
  849.         localdir          : el.getAttribute('LocalDir'),
  850.         remotedir         : el.getAttribute('RemoteDir'),
  851.         notes             : el.getAttribute('Comments'),
  852.         timezone          : (parseInt(el.getAttribute('TimeZoneOffset')) * 60) + parseInt(el.getAttribute('TimeZoneOffsetMinutes')),
  853.         ipmode            : false,
  854.         treesync          : false,
  855.         webhost           : "",
  856.         privatekey        : "",
  857.         prefix            : "",
  858.         encoding          : "UTF-8",
  859.         downloadcasemode  : 0,
  860.         uploadcasemode    : 0
  861.       };
  862.  
  863.       siteData.push(obj);
  864.     } else if (el.nodeName == 'Server') {                            // filezilla 3
  865.       var serverEl = el.firstChild;
  866.  
  867.       var obj = { account  : "", host     : "",   port             : 21,    login          : "",    password : "",     anonymous : false,
  868.                   security : "", pasvmode : true, ipmode           : false, treesync       : false, localdir : "",     remotedir : "",
  869.                   webhost  : "", prefix   : "",   downloadcasemode : 0,     uploadcasemode : 0,     encoding : "UTF-8",
  870.                   notes    : "", timezone : 0,    folder           : "",    privatekey     : "" };
  871.       obj.account = trim(el.lastChild.nodeValue);
  872.       obj.folder  = folder ? folder : "";
  873.  
  874.       while (serverEl) {
  875.         switch (serverEl.nodeName) {
  876.           case "Host":
  877.             obj.host      = serverEl.textContent;
  878.             break;
  879.           case "Port":
  880.             obj.port      = serverEl.textContent;
  881.             break;
  882.           case "Protocol":
  883.             obj.security  = serverEl.textContent == "3" ? "authssl" : (serverEl.textContent == "4" ? "authtls" : (serverEl.textContent == "1" ? "sftp" : ""));
  884.             break;
  885.           case "Logontype":
  886.             obj.anonymous = serverEl.textContent == "0";
  887.             break;
  888.           case "User":
  889.             obj.login     = serverEl.textContent;
  890.             break;
  891.           case "Pass":
  892.             obj.password  = serverEl.textContent;
  893.             break;
  894.           case "TimezoneOffset":
  895.             obj.timezone  = serverEl.textContent;
  896.             break;
  897.           case "PasvMode":
  898.             obj.pasvmode  = serverEl.textContent != "MODE_ACTIVE";
  899.             break;
  900.           case "Comments":
  901.             obj.notes     = serverEl.textContent;
  902.             break;
  903.           case "LocalDir":
  904.             obj.localdir  = serverEl.textContent;
  905.             break;
  906.           case "RemoteDir":
  907.             obj.remotedir = serverEl.textContent.substring(3);       // seriously, wtf? example: "1 0 4 test 4 aeou 7 aoe4aoe 2 4 "
  908.             obj.remotedir = obj.remotedir.replace(/\s[0-9]\s/g, "/");
  909.             break;
  910.           default:
  911.             break;
  912.         }
  913.  
  914.         serverEl = serverEl.nextSibling;
  915.       }
  916.  
  917.       if (obj.anonymous) {
  918.         obj.login    = "anonymous";
  919.         obj.password = "fireftp@example.com";
  920.       }
  921.  
  922.       siteData.push(obj);
  923.     }
  924.  
  925.     el = el.nextSibling;
  926.   }
  927.  
  928.   return siteData;
  929. }
  930.  
  931. function exportSites() {
  932.   var nsIFilePicker   = Components.interfaces.nsIFilePicker;
  933.   var fp              = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  934.   fp.defaultString    = "fireFTPsites.dat";
  935.   fp.defaultExtension = "dat";
  936.   fp.appendFilter("FireFTP (*.dat)", "*.dat");
  937.   fp.init(window, null, nsIFilePicker.modeSave);
  938.   var res = fp.show();
  939.  
  940.   if (res == nsIFilePicker.returnOK || res == nsIFilePicker.returnReplace) {
  941.     saveSiteManager(fp.file);
  942.   }
  943. }
  944.  
  945. /* RC4 symmetric cipher encryption/decryption
  946.  * Copyright (c) 2006 by Ali Farhadi.
  947.  * released under the terms of the Gnu Public License.
  948.  * see the GPL for details.
  949.  *
  950.  * Email: ali[at]farhadi[dot]ir
  951.  * Website: http://farhadi.ir/
  952.  */
  953.  
  954. function rc4Encrypt(key, pt) {
  955.     s = new Array();
  956.  
  957.     for (var i = 0; i < 256; ++i) {
  958.         s[i] = i;
  959.     }
  960.  
  961.     var j = 0;
  962.     var x;
  963.  
  964.     for (i = 0; i < 256; ++i) {
  965.         j    = (j + s[i] + key.charCodeAt(i % key.length)) % 256;
  966.         x    = s[i];
  967.         s[i] = s[j];
  968.         s[j] = x;
  969.     }
  970.  
  971.     i = 0;
  972.     j = 0;
  973.     var ct = '';
  974.  
  975.     for (var y = 0; y < pt.length; ++y) {
  976.         i    = (i + 1)    % 256;
  977.         j    = (j + s[i]) % 256;
  978.         x    = s[i];
  979.         s[i] = s[j];
  980.         s[j] = x;
  981.         ct  += String.fromCharCode(pt.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]);
  982.     }
  983.  
  984.     return ct;
  985. }
  986.  
  987. function rc4Decrypt(key, ct) {
  988.     return rc4Encrypt(key, ct);
  989. }
  990.